/**
 * 
 */
package fr.gfi.agraf.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import fr.gfi.agraf.persistence.dao.INotificationDAO;
import fr.gfi.agraf.persistence.dao.IUtilisateurDAO;
import fr.gfi.agraf.persistence.entity.Notification;
import fr.gfi.agraf.persistence.entity.Utilisateur;
import fr.gfi.agraf.service.INotificationService;
import fr.gfi.agraf.service.mapper.NotificationMapper;
import fr.gfi.agraf.vue.bean.NotificationDTO;

/**
 * @author Fw
 * 
 */
@Service("NotificationService")
@Transactional(propagation = Propagation.REQUIRED)
public class NotificationService implements INotificationService {

	/**
	 * Détermine le nombre de notifications dites "récente"
	 */
	public static final int LIMITE_NOTIFICATION = 30;

	@Autowired
	private INotificationDAO notificationDAO;

	@Autowired
	private IUtilisateurDAO utilisateurDAO;

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.gfi.agraf.service.INotificationService#
	 * marqueesToutesNotifsVuesByUtilisateur(java.lang.Long)
	 */
	public void marqueesToutesNotifsVuesByUtilisateur(final Long idUtilisateur) {
		// Je recupere toutes les notifs non vues
		final List<Notification> listeNotification = notificationDAO
				.getNotificationsByUserNonLues(idUtilisateur);
		for (final Notification notif : listeNotification) {
			notif.setVu(true);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.service.INotificationService#getListeNotifsByUser(java.lang
	 * .Long)
	 */
	public List<NotificationDTO> getListeNotifsByUser(final Long idUtilisateur) {
		final List<Notification> listeEntity = notificationDAO.getAllNotificationsByUserLimited(
				idUtilisateur, LIMITE_NOTIFICATION);
		final List<NotificationDTO> listeOutput = NotificationMapper.entityToDTOList(listeEntity);

		return listeOutput;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.gfi.agraf.service.INotificationService#
	 * envoyerNotificationToUtilisateurByProfil(java.lang.String,
	 * java.lang.Long)
	 */
	public void envoyerNotificationToUtilisateurByProfil(final String contenuNotification, final Long idProfil) {
		// Je récupére tous les utilisateurs ayant comme profil celui en
		// parametre
		final List<Utilisateur> listeUserByProfil = utilisateurDAO.getUtilisateursByProfilId(idProfil);

		// Puis j'itere en ajoute une notification à chaque fois
		for (final Utilisateur user : listeUserByProfil) {
			final Notification notif = new Notification();
			notif.setContenu(contenuNotification);
			notif.setUtilisateur(user);
			notif.setVu(false);
			notificationDAO.persist(notif);
		}

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.gfi.agraf.service.INotificationService#
	 * envoyerNotificationToUtilisateurById(java.lang.String, java.lang.Long)
	 */
	public void envoyerNotificationToUtilisateurById(final String contenuNotification,
			final Long idUtilisateur) {
		final Utilisateur userRecup = utilisateurDAO.read(idUtilisateur);

		if (userRecup != null) {
			final Notification notif = new Notification();
			notif.setContenu(contenuNotification);
			notif.setUtilisateur(userRecup);
			notif.setVu(false);
			notificationDAO.persist(notif);
		}

	}

}
